Spring Boot SSO

上篇文章提到了安全设计,使用Spring Security进行用户验证和权限验证,但一个企业级的应用系统可能存在很多应用系统,每个应用系统都需要设计安全管理,但不可能为每一个应用系统都设计一套安全管理,这样不但耗时耗力,而且要做重复的工作,也不适宜建立统一的用户中心。

可以使用单点登录SSO的方式建立一个登录认证系统,并且实现对用户的统一管理。本章在使用Spring Security安全管理的基础上,再结合OAuth2认证授权协议来实现的,它不但适用于大型的分布式管理系统,也适用于为第三方提供统一的用户管理和认证的平台。

作者给出了一个完整的实例,以模块化的设计方式进行实现,整个demo的代码可以在github上查看。

https://github.com/mainidear/spring-boot-sso.git)

demo说明

我在本地运行了demo,通过chrome查看了系统间跳转的过程,先说明下模块的划分,然后看下运行效果。

项目 工程 类型 功能
数据库管理模块 mysql 程序集成 数据库管理
安全配置模块 security 程序集成 安全策略配置和权限管理
登录认证模块 login Web应用 SSO登录认证(80)
共享资源模块 resource Web应用 共享资源(8083)
客户端应用1 web1 Web应用 客户端1(8081)
客户端应用2 web2 Web应用 客户端2(8082)

访问首页时,跳转到登录页面,输入正确的账号、密码、验证码。
登录成功后,跳转到首页:
首页

访问web1系统、web2系统时不需要重新登录,会自动登录:
web1系统首页

「登录认证模块」主要包括验证用户账号、集成OAuth2服务端端功能。

「安全配置模块」是一个公共模块,集成了SSO客户端的安全策略配置和权限管理功能,供客户端引用。

「数据库管理模块」是一个公共模块,主要提供数据库的访问功能,供其他模块使用。

「共享资源模块」提供了一个简单的公共服务,2个客户端应用可通过spring-cloud-zuul直接调用。

后面会重点介绍下登录认证模块,其他模块比较简单,不再过多介绍。

模块化设计可以提高代码的复用性,避免重复开发,实例中的「数据库管理模块」和「安全配置模块」可以被其他模块共用,减少大部分重复工作。
作者的这种设计方式值得我们学习,在以后的系统设计中,应多借鉴这种方式。

登录认证模块

我画了一个流程图,先了解下用户认证、权限验证的基本过程:
基本处理流程

整个处理流程,Spring Security都帮我们自动实现了,我们只需要对账号中心数据源、权限中心数据源进行配置和扩展,另外,可以对登录页面进行扩展,配置权限管理规则、防攻击策略、记住登录状态。

为了实现多个系统只需登录一次,需要集成OAuth2。添加spring-cloud-starter-oauth2依赖,编写一个配置类,继承AuthorizationServerConfigurerAdapter,并声明下@EnableAuthrizationServer来启用OAuth2的认证服务器功能。

OAuth2有很多授权机制,本例中使用authorization_code机制,具体配置就不过多说明了,可以参考下面的几篇文章:

[1]初步理解Spring Security并实践
[2]security OAuth2.0 提供者实现原理
[3]jwt token介绍
[4]security OAuth2.0 jwt完美整合例子

Comments